package com.cyou.nad.datastore;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cyou.nad.datastore.exception.ColumnTypeNotMatchException;
import com.cyou.nad.datastore.exception.DataListFormarValueException;
import com.cyou.nad.datastore.exception.InvalidRowColException;

/**
 * 二维表格结果集，通过行列值查找，0 开始
 * 
 * @author lzm 
 */
@SuppressWarnings("rawtypes")
public interface DataList extends Serializable {

	public enum FormatType {
		DATE, NUMBER;

		public static Map<FormatType, String> getDefaultParam() {
			Map<FormatType, String> ret = new HashMap<FormatType, String>(2);
			ret.put(DATE, "yyyy-MM-dd HH:mm:ss");
			ret.put(NUMBER, "");
			return ret;
		}
	}

	public enum SortType {
		asc, desc
	}
	/**
	 * 根据条件修改集合的数据中
	 * @param conditionCol 条件列
	 * @param destCol	目标列
	 * @param condition	条件方法
	 */
	public void changeColValueByCondition(int conditionCol,int destCol,ChangeColValueByConditionCallBack condition);

	/**
	 * 根据条件修改集合的数据中
	 * @param conditionCol 条件列
	 * @param destCol	目标列
	 * @param condition	条件方法
	 */
	public void changeColValueByCondition(int[] conditionCol,int[] destCol,ChangeColValueByConditionCallBack condition);

	/**
	 * 根据条件修改集合的数据中
	 * @param conditionCol 条件列
	 * @param destCol	目标列
	 * @param condition	条件方法
	 */
	public void changeColValueByCondition(String conditionCol,String destCol,ChangeColValueByConditionCallBack condition);

	/**
	 * 根据条件修改集合的数据中
	 * @param conditionCol 条件列
	 * @param destCol	目标列
	 * @param condition	条件方法
	 */
	public void changeColValueByCondition(String[] conditionCol,String[] destCol,ChangeColValueByConditionCallBack condition);

	/**
	 * 深度克隆
	 * @return
	 */
	public DataList clone();

	/**
	 *	列的数量
	 * @return
	 */
	public int colCount();

	/**
	 * 删除列
	 * @param col 列序号 取值0 -- size-1
	 * @throws InvalidRowColException
	 */
	public void delCol(int col) throws InvalidRowColException;

	/**
	 * 删除一行
	 * @param row 行序号 取值0 -- size-1
	 * @throws InvalidRowColException 
	 */
	public void delRow(int row) throws InvalidRowColException;
	
	/**
	 * 获得单元格的数据，
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public BigDecimal getBigDecimal(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public BigDecimal getBigDecimal(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 列的数据类型
	 * @param colNo 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 */
	public ColType getColType(int colNo) throws InvalidRowColException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.DATE, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Date getDate(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.DATE, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Date getDate(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.DOUBLE, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Double getDouble(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.DOUBLE, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Double getDouble(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.FLOAT, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Float getFloat(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.FLOAT, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Float getFloat(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;
	/**
	 * 获得头属性
	 * @return
	 */
	public List<DBHeader> getHeaders();
	
	

	/**
	 * 获得单元格的数据，列的数据类型是ColType.INTEGER, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Integer getInt(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	
	/**
	 * 获得单元格的数据，列的数据类型是ColType.INTEGER, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Integer getInt(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;
	
	/**
	 * 获得单元格的数据，列的数据类型是ColType.LONG, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Long getLong(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;
	/**
	 * 获得单元格的数据，列的数据类型是ColType.LONG, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Long getLong(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;
	/**
	 * 获得单元格的数据，
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return
	 * @throws InvalidRowColException
	 */
	public Object getObject(int row, int col) throws InvalidRowColException;
	
	/**
	 * 获得单元格的数据，
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 */
	public Object getObject(int row, String col) throws InvalidRowColException;
	
	/**
	 * 查询一行内容
	 * @param i  0 -- rowCount-1
	 * @return
	 */
	public List getRow(int i);

	/**
	 * 获得单元格的数据，列的数据类型是ColType.STRING, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @return 
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public String getString(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.STRING, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return 
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 
	 */
	public String getString(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;

	//	
	/**
	 * 如果是日期型的使用SimpleDateFormat 格式化后输出。如果要是数字型的使用 DecimalFormat，否则调用toString方法
	 * @param row
	 * @param col
	 * @param formarParam
	 * @return
	 * @throws InvalidRowColException
	 * @throws DBDataListFormarValueException
	 */
	public String getStringWithFormart(int row, int col, Map<FormatType, String> formarParam)
			throws InvalidRowColException, DataListFormarValueException;

	/**
	 * 如果是日期型的使用SimpleDateFormat 格式化后输出。如果要是数字型的使用 DecimalFormat，否则调用toString方法
	 * @param row
	 * @param col
	 * @param formarParam   可以使用DBDataList.FormatType.getDefaultParam() 获得默认的
	 * @return
	 * @throws InvalidRowColException
	 * @throws DBDataListFormarValueException
	 */
	public String getStringWithFormart(int row, String col, Map<FormatType, String> formarParam)
			throws InvalidRowColException, DataListFormarValueException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.TIMESTAMP, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序序号
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Timestamp getTimestamp(int row, int col) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 获得单元格的数据，列的数据类型是ColType.TIMESTAMP, 
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序名称 sql colname
	 * @return
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public Timestamp getTimestamp(int row, String col) throws InvalidRowColException, ColumnTypeNotMatchException;
	
	/**
	 * 
	 * @param colIndex  -1 -- colCount  0 插入最前面， -1 等同于colCount 插在最后面
	 * @param colType
	 * @param colName
	 */
	public void insertCol(int colIndex, ColType colType, String colName);

	/**
	 * 分配一行数据空间
	 * @param row  -1 --- rowCount-1  合理范围， 如果是-1 放到最后面
	 * @return
	 * @throws InvalidRowColException  row <-1  或者row >=rowCount
	 */
	public void insertRow(int row) throws InvalidRowColException;

	/**
	 * 向控制台打印信息 ，用于调试使用
	 * @param rowNum 行数，如果-1 打印全部
	 */
	public void printDebug(int rowNum);
	/**
	 * 重置
	 * @return
	 */
	public boolean reset();

	/**
	 * 行数
	 * @return
	 */
	public int rowCount();

	/**
	 * 设置单元格数据
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @param value
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	
	public void setCell(int row, int col, Comparable value) throws InvalidRowColException, ColumnTypeNotMatchException;

	/**
	 * 设置单元格数据
	 * @param row 行序号 取值0 -- size-1
	 * @param col 列序号 取值0 -- size-1
	 * @param value
	 * @throws InvalidRowColException
	 * @throws ColumnTypeNotMatchException
	 */
	public void setCell(int row, String col, Comparable value) throws InvalidRowColException, ColumnTypeNotMatchException;
	
	/**
	 * 
	 * @param col  列序号  0--- colCount()-1
	 * @param param 排序类型
	 * @throws InvalidRowColException
	 */
	public void sort(int col, SortType param) throws InvalidRowColException;
	
	/**
	 * 对集合进行过滤，
	 * 指定的列的值 如果compareTo行的对应列值 ==0 那么就存在于返回的集合中
	 * @param col  		列序号
	 * @param value		比较的值
	 * @return
	 */
	public DataList filter(int col,Comparable value);
	
	/**
	 * 对集合进行过滤，
	 * 指定的列的值 如果compareTo行的对应列值 ==0 那么就存在于返回的集合中
	 * @param col  		列序号
	 * @param value		比较的值
	 * @return
	 */
	public DataList filter(String col,Comparable value);

}
